
#coding:utf-8
import functools
from functools import reduce
import time

def performance(unit):
    def perf_decotor(f):
        @functools.wraps(f)#使用当前的装饰，进行函数属性的复制
        def wapper(*args,**kw):
            t1 = time.time()
            r = f(*args, **kw)
            t2 = time.time()
            t = (t2 - t1) * 1000 if unit=='ms' else (t2 - t1)
            print ('call %s() in %f %s' % (f.__name__, t, unit))
            return r
        #此时返回的是函数wapper，decorator返回的参数名变了，对于依赖函数名的代码就失效
        #同事decorator还改变了__doc__等属性
        #如果要让其他调用者看不出当前函数经过了decorator改造，需要将原函数的属性复制到当前新的函数中

        #wapper.__name__ = f.__name__
        #wapper.__doc__ = f.__doc__  这样使用太复杂
        return wapper
    return perf_decotor


@performance('ms')
def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n+1))

print (factorial(10))
print(factorial.__name__) #factorial
